package com.gujiangbo.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author: gujiangbo.co
 * @Contact: 646832012@qq.com
 * @Date: 2022/3/16 13:45
 * @Version: 1.0
 * @Description: SpringBoot 版本 2.x  -> Spring 5.x
 * *****正常流程*******异常流程******
 * 环绕通知之前      * 环绕通知之前   *
 * 前置通知         * 前置通知       *
 * ####业务逻辑###  * 异常通知       *
 * 返回后通知       * 后置通知       *
 * 后置通知         ****************
 * 环绕通知之后      *
 * *****************
 * SpringBoot 版本1.x    -> Spring 4.xx
 * *****正常流程*********异常流程*****
 * 环绕通知之前      * 环绕通知之前    *
 * 前置通知         * 前置通知       *
 * ####业务逻辑###  * 后置通知       *
 * 环绕通知之后      * 异常通知       *
 * 后置通知         *****************
 * 返回后通知        *
 * *****************

 */
@Aspect
@Component
public class MyAspect {

    @Before("execution(public int com.gujiangbo.aop.CalcServiceImpl.*(..))")
    public void beforeNotify() {
        System.out.println("=====@Before 前置通知=====");
    }

    @After("execution(public int com.gujiangbo.aop.CalcServiceImpl.*(..))")
    public void afterNotify() {
        System.out.println("=====@Before 后置通知=====");
    }

    @AfterReturning("execution(public int com.gujiangbo.aop.CalcServiceImpl.*(..))")
    public void afterReturnNotify() {
        System.out.println("=====@AfterReturning 返回后的通知=====");
    }

    @AfterThrowing("execution(public int com.gujiangbo.aop.CalcServiceImpl.*(..))")
    public void afterThrowingNotify() {
        System.out.println("======@AfterThrowing 我是异常通知=========");
    }

    @Around("execution(public int com.gujiangbo.aop.CalcServiceImpl.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object returnVal;
        System.out.println("我是环绕通知之前的AWAY");
        returnVal = proceedingJoinPoint.proceed();
        System.out.println("我是环绕通知之后的BOBBY");
        return returnVal;
    }
}
